package com.shujia.spark.sql

import org.apache.spark.sql.expressions.UserDefinedFunction
import org.apache.spark.sql.{DataFrame, SparkSession}

object Demo13UDF {
  def main(args: Array[String]): Unit = {
    val spark: SparkSession = SparkSession
      .builder()
      .master("local")
      .appName("Demo13UDF")
      .config("spark.sql.shuffle.partitions", 1)
      .getOrCreate()
    import spark.implicits._
    import org.apache.spark.sql.functions._

    /**
     * 1、DSL自定义函数
     * 在自定义函数中可以编写scala代码
     *
     */

    val str_len: UserDefinedFunction = udf((str: String) => {
      str.length
    })


    val studentDF: DataFrame = spark
      .read
      .format("json")
      .load("data/students.json")

    //使用自定义函数
    studentDF
      .select(str_len($"clazz"))
      .show()

    /**
     * 2、SQL 自定义函数
     *
     */
    //在sql中使用自定义函数需要注册
    spark.udf.register("str_len", str_len)
    studentDF.createOrReplaceTempView("student")
    spark
      .sql(
        """
          |select str_len(clazz) from student
          |
          |""".stripMargin)
      .show()


    /**
     * 3、在Spark-sql命令行中使用hive的自定义函数
     * 1、写一个hive的自定义函数
     * 2、将类打包上传到spark 的jars目录下 /usr/local/soft/spark-2.4.5/jars
     * 3、进入到spark-sql的命令行创建一个自定义函数
     * create function str_len as 'com.shujia.spark.sql.Demo14StrLeb';
     *
     */

  }

}
